package com.mango.leet.code.easy;

/**
 * 977. 有序数组的平方
 */

import java.util.Arrays;

/**
 * 给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方 组成的新数组，要求也按 非递减顺序 排序。
 *
 *  
 *
 * 示例 1：
 *
 * 输入：nums = [-4,-1,0,3,10]
 * 输出：[0,1,9,16,100]
 * 解释：平方后，数组变为 [16,1,0,9,100]
 * 排序后，数组变为 [0,1,9,16,100]
 * 示例 2：
 *
 * 输入：nums = [-7,-3,2,3,11]
 * 输出：[4,9,9,49,121]
 *  
 *
 * 提示：
 *
 * 1 <= nums.length <= 104
 * -104 <= nums[i] <= 104
 * nums 已按 非递减顺序 排序
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/squares-of-a-sorted-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LC977_SquaresSortedArray {
    class Solution {
        // 先平方后排序
        public int[] sortedSquares(int[] nums) {
            for(int i=0;i<nums.length;i++){
                nums[i] *= nums[i];
            }
            Arrays.sort(nums);
            return nums;
        }
        // 双指针法
        public int[] sortedSquares2(int[] nums) {
            int n = nums.length;
            int[] ans = new int[n];
            // 从两端开始遍历, 找到平方最大元素放到数组末尾
            for (int i = 0, j = n - 1, pos = n - 1; i <= j;) {
                if (nums[i] * nums[i] > nums[j] * nums[j]) {
                    ans[pos] = nums[i] * nums[i];
                    ++i;
                } else {
                    ans[pos] = nums[j] * nums[j];
                    --j;
                }
                --pos;
            }
            return ans;
        }
    }
}
/**
 * 2022-03-13
 * 思路1: 先平方，后排序
 * 思路2: 双指针法，A指针指向数组左侧，B指针指向数组右侧，如果左边的平方大于右边的平方，则将左边的平方数值赋值给数组最右边；反之将右边数值的平方赋值给数组最右边。
 */
